#ifndef NODO_H_
#define NODO_H_
#include <vector>
#include <iostream>
using namespace std;
#include <string>
#include <sys/stat.h>

class Nodo {

public:

	/**
	 * Constructor de la clase Nodo.
	 * @param nombre Nombre del nodo.
	 * @param numID Número de ID único para el nodo.
	 * @param nivel Indicador del nivel en que se encuentra el nodo.
	 * @param esDirectorio Variable que indica si el nodo es un directorio o no.
	 */
	Nodo(string nombre, int numID, int nivel, bool esDirectorio);

	/**
	 * Destructor de la clase nodo.
	 */
	~Nodo();

	void MostrarPadreHijos();

	/**
	 * Añade un hijo al nodo.
	 * @param nodo Puntero al nodo hijo previamente creado.
	 * @return Nodo* Puntero al nodo añadido.
	 */
	Nodo* AnadirHijo(Nodo* nodo);

	/**
	 * Busca un hijo a partir de su número ID.
	 * @param nodoId Número ID del nodo a buscar.
	 * @return Nodo* Puntero al nodo encontrado (si no existe se devuelve puntero a NULL).
	 */
	Nodo* BuscarHijo(unsigned int nodoId);

	/**
	 * Actualiza los campos para el ID, nombre, tamaño y fecha de última modificación del nodo.
	 * @param nodoId Nuevo número de ID para el nodo.
	 * @param nombre Nuevo nombre para el nodo.
	 * @param tamano Nuevo tamaño para el nodo.
	 * @param ultimaModificación Nueva fecha de la última modificación para el nodo.
	 */
	void ActualizarNodo(unsigned int nodoId, string nombre, off_t tamano, time_t ultimaModificacion);

	/**
	 * Elimina un nodo a partir de su ID.
	 * @param nodoId ID del nodo a eliminar.
	 */
	void EliminarNodo(unsigned int nodoId);

	bool GetEsDir();

	off_t GetTamano();

	time_t GetUltMod();

	int ChildNum();

	Nodo* GetHijo(int index);

	Nodo* GetPadre();

	string GetNombre();

	unsigned int GetNumId();

	int GetNivel();

	int GetNumHijos();

	int GetBloqueIndiceByIndex(int i);

	int GetNumBloques();

	void AnadirBloqueIndice(int bloqI);

	void EliminarBloqueIndice();

	void SetNumHijos(int nHijos);

	void SetNombre(string nomNuevo);

	void SetNumId(unsigned int numId);

	void SetTamano(off_t tam);

	void SetTimeUltId(time_t tim);

	void SetEsDir(bool dir);

	Nodo* GetNodoByNom(string nombre);

	Nodo* CopiarNodo();

	/**
	 * Devuelve un booleano que indica si el nodo es hijo o no.
	 * @param nodoId ID del nodo a buscar.
	 * @return bool Booleano que indica si el nodo es hijo o no.
	 */
	bool EsHijo(unsigned int nodoId);

private:

	/**
	 * Devuelve el índice de un nodo a partir de su ID.
	 * @param nodoId ID del nodo a buscar.
	 * @return int Índice del nodo buscado (si existe, sino devuelve un 0).
	 */
	unsigned int IndexOf(unsigned int nodoId);

	Nodo* padre;
	vector<Nodo*> hijos;
	string nombrePadre;
	string nombre;
	int numHijos;
	unsigned int numId;
	unsigned int nivel;
	bool esDirectorio;
	off_t tamano;
	time_t ultimaModificacion;
	vector<int> idBloqueIndice;

};

#endif /* NODO_H_ */
